'''
视图函数的核心部分，负责处理请求并生成响应
1.定义视图函数 视图函数是处理请求并返回响应的核心功能
2.接受请求数据 使用request对象获取URL参数、表单数据、查询参数等
3.返回响应 可以返回字符串、HTML、JSON或自定义响应对象
4.处理请求和响应 使用request对象和make_response来处理请求和生成自定义响应
5.处理错误 视图函数内处理异常或使用Flask的错误处理机制。
6.视图函数的装饰器 使用@app.before_request、@app.after_requet等装饰器处理请求前后逻辑
7.视图函数返回状态码 可以指定HTTP状态码来表示请求处理结果
'''

#1.定义视图函数
#视图函数是一个普通的python函数，他接受请求并返回响应，视图函数通常与路由配合使用，通过装饰器将URL映射到视图函数
from flask import Flask
app=Flask(__name__)
@app.route('/')
def home():
    return 'hello world'
#@app.route('/')将根URL/映射到home视图函数
#def home()：视图函数，返回字符串“hello world”作为响应

#2.接受请求数据
#视图函数可以接受不同类型的请求数据，包括URL函数、表单数据、查询参数等
@app.route('/greet/<name>')
def greet(name:str):
    return f'hello {name}'#name是一个URL参数，传递到视图函数greet中

from flask import request
@app.route('/submit',method=['POST'])
def submit():
    username=request.form.get('username')
    return f'Form submittd by {username}!'
#request.form.get('username'):获取POST请求中表单数据的username字段
#获取查询参数
@app.route('/sreach')
def search():
    query=request.args.get('query')
    return f'Search results for : {query}'
#requeset.args.get('query'):获取get请求中的查询函数

#3.返回响应
#视图函数可以返回多种类型的响应，包括字符串，HTML，JSON或自定义响应对象
#返回字符串
@app.route('/message')
def message():
    return 'This is a simple message'
from flask import render_template
@app.route('/hello/<name>')
def hello(name):
    return render_template('hello.html',name=name)
#render_template('hello.html',name=name)渲染html模板hello.html，并将name变量传递给模板
#返回json数据
from flask import jsonify
app.route('/api/data')
def api_data():
    data={'key':'value'}
    return jsonify(data)

#4.处理请求
#视图函数可以访问请对象，并根据请求数据生成响应，可以使用request对象来获取请求的信息
#使用make_response来创建自定义的响应
#使用requst对象
from flask import request

@app.route('/info')
def info():
    user_agent=request.headers.get('User-Agent')
    return f'Your user agent is {user_agent}'
#request.header.get('User-Agent')获取请求头中User-Agent信息
#使用make_response

from flask import make_response
@app.route('/header')
def custom_header():
    response=make_response('Response with custom header') #创建响应对象并设置头信息
    response.headers['X-Custom-Header']='Value'
    return response

#5.处理错误
#可以在视图中处理异常或错误，或者通过flask提供的错误机制来处理应用中的错误
@app.route('/divide/<int:x>/<int:y>')
def divide(x,y):
    try :
        result=x/y
        return f'Result:{result}'
    except ZeroDivisionError:
        return 'Error: Division bu zero',400
#使用try-except语句处理除零错误，并返回自定义错误消息和状态码

#6.视图函数的装饰器
#除了app.route还包括
#@app.before_request 在每个请求处理之前运行的函数
#@app.after_request 在每个请求处理之后运行的函数
#@app.teardown_request 在请求结束后运行的函数，用于清理工作

#示例装饰器使用
@app.before_request
def befor_request():
    print('Before request')

@app.after_request
def after_request(response):
    print('After request')

@app.teardown_request
def teardown_request(exception):
    print('Teardown request')

#7.视图函数返回的状态码
@app.route('/status')
def status():
    return 'Evething is ok',200

#返回带有响应码的响应对象
from flask import Response
@app.route('/error')
def errror():
    return Response('An error accurred',status=500)
